/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Front.Presentador;

import AccesoDatos.Fabricas.DAO;
import AccesoDatos.Fabricas.DAO.Opciones;
import Excepciones.NoConexionException;
import Front.Contrato.IContratoGestorDescarga;
import Logica.Comandos.ComandoIniciarDescarga;
import Logica.Fabricas.Comando;
import ObjetoDominio.Archivo;
import Front.Vista.ObjetosComunes.Descarga;
import Logica.Comandos.ComandoCargarArchivo;
import ObjetoDominio.Servidor;
import ObjetoDominio.Usuario;
import Session.ArchivoLog;
import Session.Session;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.table.DefaultTableModel;

/**
 *Clase que hace de presentador para la vista de la gestion de las descargas
 * @author familia
 */
public class PresentadorGestorDescarga {
    
    private IContratoGestorDescarga _vista;
    private Servidor _servidor;
    private Usuario _usuario;
    
    public PresentadorGestorDescarga(IContratoGestorDescarga vista, 
            Servidor servidor, Usuario usuario){
        _vista = vista;
        _servidor = servidor;
        _usuario = usuario;        
    }
    
    
//    private void ListarDescargasYCargasPendiente(){
//        try {
//            Comando comando = new ComandoObtenerListaArchivosCliente(_usuario);
//            List<Archivo> lista = (List<Archivo>) comando.Ejecutar();
//            for(Archivo archivo : lista){
//                if (archivo.getDescargado() <= archivo.getTamaño()){
//                    DefaultTableModel modelo = (DefaultTableModel) _vista.getTablaDescarga()
//                .getModel();
//                    JProgressBar progreso = new JProgressBar();
//                    Object[] datos = new Object[4];
//                    JLabel descargado = new JLabel("0");
//                    JLabel estado = new JLabel((archivo.isCargando())?"Cargando":"Descargando");
//                    datos[0] = archivo.getNombre();
//                    datos[1] = progreso;
//                    datos[2] = estado;
//                    datos[3] = descargado;
//                    modelo.addRow(datos);
//                    comando = (archivo.isCargando())?new ComandoCargarArchivo(archivo):
//                            new ComandoIniciarDescarga(archivo);
//                   HiloStatusDescarga hilo = new HiloStatusDescarga(_vista.getTablaDescarga(), 
//                                progreso, archivo,descargado, estado);
//                    Descarga descarga = new Descarga(comando, hilo, archivo);
//                        if(!archivo.isPausado())
//                            descarga.start();
//                        else
//                            descarga.pause();
//                    Session.getEstaus().add(descarga);
//                }
//                        
//            }
//            
//        } catch (NoConexionException ex) {
//            Logger.getLogger(PresentadorGestorDescarga.class.getName()).log(Level.SEVERE, null, ex);
//        }
//    }
    
    /**
     * Metodo que se encarga de realizar la inicializacion de los componentes iniciales
     * de la vista
     */
    public void CargarPagina(){
        try {
            //ListarDescargasYCargasPendiente();
            _vista.getContenedorPanelControl().setVisible(false);
            _vista.getContenedorDescargas().setVisible(false);
            _vista.getContenedorBuscador().setVisible(true);
            InicioHilo controlSession = new InicioHilo(_vista);
            controlSession.start();
            _vista.getTablaLista().removeAll();
            DefaultTableModel modelo = 
                    (DefaultTableModel) _vista.getTablaLista().getModel();
            modelo.addColumn("Nombre");
            modelo.addColumn("Tipo");
            modelo.addColumn("Tamaño");
            for (Archivo object : Session.getListaArchivo()) {
              Object[] datos = new Object[3];
              datos[0] = object.getNombre();
              datos[1] = "Archivo de Texto";
              datos[2] = FormatoBytes(object.getTamaño());
              modelo.addRow(datos);
              _vista.getTablaLista().setModel(modelo);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        
    }
    
    private boolean IsValidoCantidadDescargas(){
        int cantidad = 0;
        boolean retorno;
        for(Descarga descarga : Session.getEstaus()){
            if(!descarga.isTerminado())
                cantidad++;
        }
        if (cantidad < 5)
            retorno = true;
        else
            retorno = false;
        return retorno;
    }
    
    public void CancelarDescarga(){
        
        Session.getEstaus().get(_vista.getTablaDescarga()
                .getSelectedRow()).parar();
    }
    
    /**
     * Metodo que da formato en kb a numeros en bytes
     * @param tamaño
     * @return 
     */
    public String FormatoBytes(long tamaño){
        float numero = ((float)tamaño / 1024);
        numero = numero * 100;
        numero = Math.round(numero);         
        return String.valueOf(numero/100) + " Kb";
    }
    
    /**
     * Metodo que se encarga de realizar las llamadas requeridas
     * para subir un archivo al repositorio
     * @param archivo 
     */
    public void CargarArchivo(Archivo archivo){
        
        DefaultTableModel modelo = (DefaultTableModel) _vista.getTablaDescarga()
                .getModel();
        archivo.setCargando(true);
        archivo.setPausado(false);
        JProgressBar progreso = new JProgressBar();
        Object[] datos = new Object[4];
        JLabel descargado = new JLabel("0");
        JLabel estado = new JLabel("Cargando");
        datos[0] = archivo.getNombre();
        datos[1] = progreso;
        datos[2] = estado;
        datos[3] = descargado;
        modelo.addRow(datos);
        HiloStatusDescarga hilo = 
                new HiloStatusDescarga(_vista.getTablaDescarga(), 
                progreso, archivo,descargado, estado);
        Comando comando = new ComandoCargarArchivo(archivo);
        Descarga descarga = new Descarga(comando, hilo, archivo);
        descarga.start();
        Session.getEstaus().add(descarga);
    }
    
    /**
     * Metodo que realiza la accion requerida para que el sistema descargue
     * un archivo del respositorio
     */
    public void DescargarArchivo(){
        
        DefaultTableModel modelo = (DefaultTableModel) _vista.getTablaDescarga()
                .getModel();
        Archivo archivo = Session.getListaArchivo().get(_vista.getTablaLista()
                .getSelectedRow());
        archivo.setRuta(archivo.getNombre());
        archivo.setCargando(false);
        archivo.setPausado(false);
        JProgressBar progreso = new JProgressBar();
        Object[] datos = new Object[4];
        JLabel descargado = new JLabel("0");
        JLabel estado = new JLabel("Descargando");
        datos[0] = archivo.getNombre();
        datos[1] = progreso;
        datos[2] = estado;
        datos[3] = descargado;
        modelo.addRow(datos);
        HiloStatusDescarga hilo = 
                new HiloStatusDescarga(_vista.getTablaDescarga(), 
                progreso, archivo,descargado, estado);
        ComandoIniciarDescarga comando = new ComandoIniciarDescarga(archivo);
        Descarga descarga = new Descarga(comando, hilo, archivo);
        descarga.start();
        Session.getEstaus().add(descarga);
    }
    
    /**
     * Metodo que realiza la accion requerida para que el sistema elimine
     * un archivo del respositorio
     */
    public void EliminarArchivo(){
        
    }
    
    /**
     * Metodo que pausa una descarga seleccionada
     */
    public void PausarDescarga(){
        Session.getEstaus().get(_vista.getTablaDescarga()
                .getSelectedRow()).pause();
    }
    
     /**
     * Metodo que reanuda una descarga seleccionada
     */
    public void ReanudarDescarga(){
        try {
            
        Session.getEstaus().get(_vista.getTablaDescarga()
                .getSelectedRow()).reanudar();
        } catch (Exception e) {
        }
    }
    
    /**
     * Metodo que se encarga de las acciones requeridas cuando se le da click
     * a un elemento de la lista de archivos
     */
    public void ClickElementoListaArchivos(){
        
        if(IsValidoCantidadDescargas()){
            int seleccion = JOptionPane.showOptionDialog(
                    _vista.getVentana(), "Acciones Sobre el Archivo", "Selector de opciones",
           JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,
           new Object[] { "Descargar", "Eliminar", "Salir" }, "Salir");

            switch(seleccion){
                case 0:
                    DescargarArchivo();
                    break;
                case 1:
                    EliminarArchivo();
                    break;
                case 2:
                    break;
            }
        }else{
            JOptionPane.showMessageDialog(_vista.getVentana(),
                        "Itenta superar el maximo de descargas (5)",
                        "Maximo de Descargas",
                        JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Metodo que muesta la lista de descargas
     */
    public void MostrarDescargas(){
        _vista.getContenedorPanelControl().setVisible(false);
        _vista.getContenedorDescargas().setVisible(true);
        _vista.getContenedorBuscador().setVisible(false);
    }
    
    /**
     * Metodo que Muestra la lista de archivos para descargar
     */
    public void MostrarBusqueda(){
        _vista.getContenedorPanelControl().setVisible(false);
        _vista.getContenedorDescargas().setVisible(false);
        _vista.getContenedorBuscador().setVisible(true);
    }
    
    /**
     * Metodo que muestra el panel de control
     */
    public void MostrarPanelControl(){
        _vista.getContenedorPanelControl().setVisible(true);
        _vista.getContenedorDescargas().setVisible(false);
        _vista.getContenedorBuscador().setVisible(false);
    }
    
}
